package excercise;

public class EX05_OOP4 {
	
	
	public static void main(String[] args) {
		
		//사각형
		
		Retanglesjvo sjvo = new Retanglesjvo(80.9f, 90.4f, "white");
		sjvo.Area = RetangleService.getArea(sjvo.width, sjvo.height);
		sjvo.Perimeter = RetangleService.getPerimeter(sjvo.width, sjvo.height);
		
		System.out.println(sjvo.color);
		System.out.println(sjvo.Area);
		System.out.println(sjvo.Perimeter);
		
		//교수님꺼 뺏겨쓰는 사각형
		Retanglesjvo2 sjvo2 = new Retanglesjvo2(35f, 45f, "silver");
		float Area2 = RetangleService2.getArea(sjvo2.width, sjvo2.height);
		float Perimeter2 = RetangleService2.getPerimeter(sjvo2.width, sjvo2.height);
		
		System.out.println(sjvo2.color);
		System.out.println(Area2);
		System.out.println(Perimeter2);
		
		System.out.println();
		//선풍기
		Fanvo fvo = new Fanvo();
		float as = FanService.toString(fvo.SLOW, fvo.MEDIUM, fvo.FAST, fvo.speed, fvo.on, fvo.radius, fvo.color);
		
		fvo.speed = "FAST";
		fvo.radius = 10;
		fvo.on = true;
		fvo.color = "yellow";
		
		System.out.println(fvo.color + " " + fvo.speed + " " + fvo.radius + " " + fvo.on);
		
		System.out.println();
		float as2 = FanService.toString2(fvo.SLOW, fvo.MEDIUM, fvo.FAST, fvo.speed, fvo.on, fvo.radius, fvo.color);
		fvo.speed = "MEDIUM";
		fvo.radius = 5;
		fvo.on = false;
		fvo.color = "blue";
		
		
		System.out.println(fvo.color + fvo.speed + fvo.radius + fvo.on);
		
		//Fanvo2 f = new Fanvo2(new Fanvo2().FAST, true, 10, "yellow");
		//Fanvo2 f = new Fanvo2(Fanvo2.FAST, true, 10, "yellow");
		
		//System.out.println(FanService2.showFanInfo(f.speed, f.on, f.radius, f.color));
		//System.out.println(Fanvo.showFanInfo(f));
		
		
		AccountVO a = new AccountVO(1122, 20000, 4.5F, "20131108");
		
		AccountService.withraw(2500, a.balence);
		System.out.println(a.balence);
		/*
		
			call by value(값에 의한 전달)
			메서드의 매개변수 유형이 기본 자료형인 경우
			기본 자료형 값을 메서드의 매개변수로 전달하면
			JVM은 메서드의 지역변수의 그 값을 복사해줌
			따라서, 메서드의 지역변수 값을 변경하더라도
			전달해준 변수에는 영향을 미치지 않음
			
		 */		
		AccountService.withraw(2500, a);
		System.out.println(a.balence);
		/*
			call by reference(주소에 의한 전달)
			메서드의 매개변수 유형이 참조 자료형인 경우
			만일, 참조형 변수를 메서드의 매개변수로 전달하면
			지역변수는 참조형 변수가 전달해 준 객체를 가리키게 됨
			즉, 참조형 변수에 저장된 값은 실제 값이 아니고
			그 값을 가리키는 주소를 의미하기 때문임
			따라서, 메서드에서 참조된 객체에 변경을 가하면
			그 변화는 호출된 코드에도 반영됨
		*/		
	}
	
}
class Retanglesjvo {
	
	float width;
	
	float height;
	
	String color;
	
	float Area;
	float Perimeter;
	
	public Retanglesjvo(){}
	
	public Retanglesjvo(float width, float height, String color){
		
		this.width = width;
		this.height = height;
		this.color = color;
		
	}
	
}

class RetangleService {
	
	static float getArea(float width, float height){
		
		return width * height;
		
	}
	
	static float getPerimeter(float width, float height){
		
		return 2 * width + 2 * height;
		
	}
	
}

//교수님꺼 뺏기기

class Retanglesjvo2 {
	
	float width;
	
	float height;
	
	String color;
	
	public Retanglesjvo2(){
		
		width = 1.0F;
		height = 1.0F;
		color = "white";
		
	}
	
	public Retanglesjvo2(float width, float height, String color){
		
		this.width = width;
		this.height = height;
		this.color = color;
		
	}
	
	
}

class RetangleService2 {
	
	static float getArea(float width, float height){
		
		return width * height;
		
	}
	
	static float getPerimeter(float width, float height){
		
		return (2 * width) + (2 * height);
		
	}
	
}


class Fanvo {
	final int SLOW;
	final int MEDIUM;
	final int FAST;
	String speed;
	boolean on;
	float radius;
	String color;
	
	public Fanvo(){
		SLOW=1;
		MEDIUM=2;
		FAST=3;
		speed="SLOW";
		on=false;
		radius=5F;
		color="blue";
	}
	
	public Fanvo(int SLOW, int MEDIUM, int FAST, String speed, boolean on, float radius, String color){
		
		this.SLOW = SLOW;
		this.MEDIUM = MEDIUM;
		this.FAST = FAST;
		this.speed = speed;
		this.on = on;
		this.radius = radius;
		this.color = color;
		
	}
	
}


class FanService{
	
	
	static float toString(int SLOW, int MEDIUM, int FAST, String speed, boolean on, float radius, String color){
		
		System.out.println(speed);
		System.out.println(on);
		System.out.println(radius);
		return radius;
		
	}
	static float toString2(int SLOW, int MEDIUM, int FAST, String speed, boolean on, float radius, String color){
		
		System.out.println(speed);
		System.out.println(on);
		System.out.println(radius);
		return radius;
		
	}
	
	
	
}

class Fanvo2 {
	/*
	
			속도를 나타내는 상수들은 객체 생성 없이 바로 사용가능해야 함
			따라서, static final 예약어를 사용함
			한편, JDK 5이상에서는 이것을 대체하기 위해
			Enum 이라는 새로운 클래스 자료형이 추가됨
			
	*/
	final int SLOW = 1;
	final int MEDIUM = 2;
	final int FAST = 3;
	
	int speed;
	boolean on;
	float radius;
	String color;
	
	public void Fanvo2(){
		speed=this.SLOW;
		on=false;
		radius=5F;
		color="blue";
	}
	
	public void Fanvo2(int speed, boolean on, float radius, String color){
		
		this.speed = speed;
		this.on = on;
		this.radius = radius;
		this.color = color;
		
	}
	
}

class FanService2{
	
	/*
			
			메서드 다중정의(overloading)
			메서드 서명만 다르면 메서드 이름은 동일하게 작성가능
			
	*/	
	static String showFanInfo(int speed, boolean on, float radius, String color){

		String msg = "";
		if(on){
			msg = speed + ", " + on + ", " + radius + ", " + color;
		}else{
			msg = speed + ", " + "꺼져있음 " + ", " + radius + ", " + color;
		}
		return msg;
	}

	
	static String showFanInfo(Fanvo f){
		String msg = "";
		if(f.on){
			msg = f.speed + ", " + f.on + ", " + f.radius + ", " + f.color;
		}else{
			msg = f.speed + ", " + "꺼져있음 " + ", " + f.radius + ", " + f.color;
		}
		return msg;
	}
	
	
	
}

class AccountVO {
	
	int aid;
	int balence;
	float interestRate;
	String dateCreated;
	
	public AccountVO(){
		aid = 0;
		balence = 0;
		interestRate = 0;
	}
	public AccountVO(int aid, int balence, float interestRate, String dateCreated){
		
		this.aid = aid;
		this.balence = balence;
		this.interestRate = interestRate;
		this.dateCreated = dateCreated;
		
	}
	
}

class AccountService{
	
	static float getMonthlyInterestRate(float interestRate){
		return interestRate /12;
	}
	
	static int withraw(AccountVO a, int gold){
		a.balence -= gold;
		System.out.println("인출 후 잔액 " + a.balence + "만원입니다. 돈좀....");
		return a.balence;
	}
	
	
	static int withraw(int gold, int balence){
		balence -= gold;
		System.out.println("인출 후 잔액 " + balence + "만원입니다. 돈좀....");
		return balence;
	}
	
	static int deposit(int gold, int balence){
		balence += gold;
		System.out.println("인출 후 잔액 " + balence + "만원입니다. 돈좀....");
		return balence;
	}
	
}